/* exported TransientSignalHolder, addObjectSignalMethods */
const { GObject } = imports.gi;
+const destroyableTypes = [];
+
/**
* @private
* @param {Object} obj - an object
* @returns {bool} - true if obj has a 'destroy' GObject signal
*/
function _hasDestroySignal(obj) {
- return obj instanceof GObject.Object &&
- GObject.signal_lookup('destroy', obj);
+ return destroyableTypes.some(type => obj instanceof type);
}
var TransientSignalHolder = GObject.registerClass(
this.emit('destroy');
}
});
+registerDestroyableType(TransientSignalHolder);
class SignalManager {
/**
};
proto['disconnect_object'] = proto['disconnectObject'];
}
+
+/**
+ * Register a GObject type as having a 'destroy' signal
+ * that should disconnect all handlers
+ *
+ * @param {GObject.Type} gtype - a GObject type
+ */
+function registerDestroyableType(gtype) {
+ if (!GObject.type_is_a(gtype, GObject.Object))
+ throw new Error(`${gtype} is not a GObject subclass`);
+
+ if (!GObject.signal_lookup('destroy', gtype))
+ throw new Error(`${gtype} does not have a destroy signal`);
+
+ destroyableTypes.push(gtype);
+}
SignalTracker.addObjectSignalMethods(prototype);
};
+ SignalTracker.registerDestroyableType(Clutter.Actor);
+
// Miscellaneous monkeypatching
_patchContainerClass(St.BoxLayout);
const Layout = imports.ui.layout;
const Main = imports.ui.main;
const Params = imports.misc.params;
+const SignalTracker = imports.misc.signalTracker;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
this.run_dispose();
}
});
+SignalTracker.registerDestroyableType(Notification);
var NotificationBanner = GObject.registerClass({
Signals: {
}
}
});
+SignalTracker.registerDestroyableType(Source);
var MessageTray = GObject.registerClass({
Signals: {
const Signals = imports.signals;
const Environment = imports.ui.environment;
-const { TransientSignalHolder } = imports.misc.signalTracker;
+const { TransientSignalHolder, registerDestroyableType } = imports.misc.signalTracker;
Environment.init();
const Destroyable = GObject.registerClass({
Signals: { 'destroy': {} },
}, class Destroyable extends GObject.Object {});
+registerDestroyableType(Destroyable);
class PlainEmitter {}
Signals.addSignalMethods(PlainEmitter.prototype);